closure so that stored tracks can be retrieved.
Note that this forces the widening of the command array to two bytes -
it's always technically _been_ two byts, but we've never had a command
# > 127 before. This does have the potential to expose naughtiness if
we've missed any endian swaps...
case 800:
gps_pvt_transfer = pA800;
break;
-
+ case 1000:
+ gps_run_transfer = pA1000;
+ break;
}
break;
return ret;
}
+/*
+ * This is to get around a problem with the x305 sporting units.
+ * The unit will not "finalize" a track unless the operator manually
+ * does it from the pushbutton panel OR until the device has gone through
+ * a 'get runs' cycle. Garmin's Training Center, of course, does this
+ * because it actually uses that data. Here we just go through the
+ * mechanics of building and sending the requests and then throwing away
+ * all the data in order to finalize that.
+ *
+ * Hopefully, this won't be needed forever.
+ */
+drain_run_cmd(gpsdevh *fd)
+{
+ GPS_PPacket tra;
+ GPS_PPacket rec;
+ static UC data[2];
+ if(!(tra = GPS_Packet_New()) || !(rec = GPS_Packet_New()))
+ return MEMORY_ERROR;
+ GPS_Util_Put_Short(data,
+ COMMAND_ID[gps_device_command].Cmnd_Transfer_Runs);
+ GPS_Make_Packet(&tra, LINK_ID[gps_link_type].Pid_Command_Data,
+ data,2);
+
+ if(!GPS_Write_Packet(fd,tra))
+ return gps_errno;
+ if(!GPS_Get_Ack(fd, &tra, &rec))
+ return gps_errno;
+
+ for(;;) {
+ if(!GPS_Packet_Read(fd, &rec))
+ return gps_errno;
+ if(!GPS_Send_Ack(fd, &tra, &rec))
+ return gps_errno;
+ if(rec->type == LINK_ID[gps_link_type].Pid_Xfer_Cmplt) {
+ break;
+ }
+ }
+}
/* @func GPS_A301_Get ******************************************************
**
if(!GPS_Device_On(port, &fd))
return gps_errno;
+ if ((gps_trk_type == pD304) && gps_run_transfer) {
+ drain_run_cmd(fd);
+ }
+
if(!(tra = GPS_Packet_New()) || !(rec = GPS_Packet_New()))
return MEMORY_ERROR;
*/
const char *
-Get_Pkt_Type(unsigned char p, unsigned char d0, const char **xinfo)
+Get_Pkt_Type(unsigned char p, unsigned short d0, const char **xinfo)
{
*xinfo = NULL;
#define LT LINK_ID[gps_link_type]
case 92: *xinfo = "Flight Records"; break;
case 117: *xinfo = "Xfer Laps"; break;
case 121: *xinfo = "Xfer Categories"; break;
+ case 450: *xinfo = "Xfer Runs"; break;
+ case 451: *xinfo = "Xfer Workouts"; break;
+ case 452: *xinfo = "Xfer Wkt Occurrences"; break;
+ case 453: *xinfo = "Xfer User Profile "; break;
+ case 454: *xinfo = "Xfer Wkt Limits"; break;
default: *xinfo = "Unknown";
}
return "CMDDAT";
int32 GPS_A800_Get(gpsdevh **fd, GPS_PPvt_Data *packet);
void GPS_D800_Get(GPS_PPacket packet, GPS_PPvt_Data *pvt);
-const char * Get_Pkt_Type(unsigned char p, unsigned char d0, const char **xinfo);
+const char * Get_Pkt_Type(unsigned char p, unsigned short d0, const char **xinfo);
#endif
struct COMMANDDATA COMMAND_ID[2]=
{
{
- 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x31,0x32,92,117,121
+ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x31,0x32,92,117,121,450
}
,
{
struct COMMANDDATA
{
- UC Cmnd_Abort_Transfer;
- UC Cmnd_Transfer_Alm;
- UC Cmnd_Transfer_Posn;
- UC Cmnd_Transfer_Prx;
- UC Cmnd_Transfer_Rte;
- UC Cmnd_Transfer_Time;
- UC Cmnd_Transfer_Trk;
- UC Cmnd_Transfer_Wpt;
- UC Cmnd_Turn_Off_Pwr;
- UC Cmnd_Start_Pvt_Data;
- UC Cmnd_Stop_Pvt_Data;
- UC Cmnd_FlightBook_Transfer;
- UC Cmnd_Transfer_Lap;
- UC Cmnd_Transfer_Wpt_Cats;
+ US Cmnd_Abort_Transfer;
+ US Cmnd_Transfer_Alm;
+ US Cmnd_Transfer_Posn;
+ US Cmnd_Transfer_Prx;
+ US Cmnd_Transfer_Rte;
+ US Cmnd_Transfer_Time;
+ US Cmnd_Transfer_Trk;
+ US Cmnd_Transfer_Wpt;
+ US Cmnd_Turn_Off_Pwr;
+ US Cmnd_Start_Pvt_Data;
+ US Cmnd_Stop_Pvt_Data;
+ US Cmnd_FlightBook_Transfer;
+ US Cmnd_Transfer_Lap;
+ US Cmnd_Transfer_Wpt_Cats;
+ US Cmnd_Transfer_Runs;
}
;
* Lap Data Transfer
*/
#define pA906 906
-
int32 gps_lap_transfer;
+#define pA1000 1000
+int32 gps_run_transfer;
+
/*
if (gps_show_bytes) {
int i;
const char *m1, *m2;
+ unsigned short pkttype = le_read16(&ibuf->gusb_pkt.databuf[0]);
GPS_Diag("RX (%s) [%d]:",
receive_state == rs_fromintr ? "intr" : "bulk", rv);
GPS_Diag("%c", isalnum(buf[i])? buf[i] : '.');
}
- m1 = Get_Pkt_Type(ibuf->gusb_pkt.pkt_id[0],
- ibuf->gusb_pkt.databuf[0], &m2);
+ m1 = Get_Pkt_Type(ibuf->gusb_pkt.pkt_id[0], pkttype, &m2);
if ((rv == 0) && (receive_state == rs_frombulk) ) {m1= "RET2INTR";m2=NULL;};
GPS_Diag("(%-8s%s)\n", m1, m2 ? m2 : "");
}
rv = gusb_llops->llop_send(opkt, sz);
if (gps_show_bytes) {
+ unsigned short pkttype = le_read16(&opkt->gusb_pkt.databuf[0]);
GPS_Diag("TX [%d]:", sz);
for(i=0;i<sz;i++)
for(i=0;i<sz;i++)
GPS_Diag("%c", isalnum(obuf[i])? obuf[i] : '.');
- m1 = Get_Pkt_Type(opkt->gusb_pkt.pkt_id[0],
- opkt->gusb_pkt.databuf[0], &m2);
+ m1 = Get_Pkt_Type(opkt->gusb_pkt.pkt_id[0], pkttype, &m2);
GPS_Diag("(%-8s%s)\n", m1, m2 ? m2 : "");
}